package ar.uade.edu.fain.ad.client.swing;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

import ar.uade.edu.fain.ad.client.delegate.AdministracionDelegate;
import ar.uade.edu.fain.ad.client.delegate.DelegateFactory;
import ar.uade.edu.fain.ad.client.swing.mapping.RemitoMapper;
import ar.uade.edu.fain.ad.client.swing.util.ViewUtils;
import ar.uade.edu.fain.ad.client.swing.util.xml.FormatoInvalidoException;
import ar.uade.edu.fain.ad.client.swing.util.xml.RemitoXmlReader;
import ar.uade.edu.fain.ad.common.exception.OrdenCompraInexistenteException;
import ar.uade.edu.fain.ad.common.exception.ProductoInexistenteException;
import ar.uade.edu.fain.ad.common.transfer.ImportacionRemitoVO;
import ar.uade.edu.fain.ad.common.transfer.ItemOrdenCompraVO;
import ar.uade.edu.fain.ad.common.transfer.NotaDevolucionVO;
import ar.uade.edu.fain.ad.common.transfer.RemitoVO;

public class RecepcionMercaderiaDepositoCentralVW extends javax.swing.JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public RecepcionMercaderiaDepositoCentralVW() {
		super();
		initGUI();
	}

	private void initGUI() {
		try {
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			getContentPane().setLayout(null);
			final JTextField pathTextField = new JTextField();
			pathTextField.setBounds(250, 25, 300, 23);
			getContentPane().add(pathTextField);
			JLabel pathLabel = new JLabel();
			getContentPane().add(pathLabel);
			pathLabel.setText("Archivo local XML con Remito:");
			pathLabel.setBounds(12, 25, 200, 16);
			final JTextArea resultadoArea = new JTextArea();
			getContentPane().add(resultadoArea);
			resultadoArea.setBounds(12, 50, 500, 200);
			final JButton submit = new JButton("Cargar y procesar");
			getContentPane().add(submit);
			submit.setBounds(250,260,200,50);
			submit.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent arg0) {
					final DelegateFactory delegateFactory = ViewUtils.get()
							.getDelegateFactory();
					final AdministracionDelegate delegate = delegateFactory
							.createAdministracionDelegate();
					final String path = pathTextField.getText();
					RemitoVO remitoVO = null;
					try {
						remitoVO = new RemitoMapper()
								.mapear(new RemitoXmlReader(path).leer());
					} catch (IOException e) {
						resultadoArea.setText(e.getClass().getName() + ": "
								+ e.getMessage());
					} catch (FormatoInvalidoException e) {
						resultadoArea.setText(e.getClass().getName() + ": "
								+ e.getMessage());
					}
					if (remitoVO == null) {
						return;
					}
					try {
						final ImportacionRemitoVO importacionRemito = 
								delegate.procesarRemito(remitoVO);
						final String texto = 
								generarTextoResultadoDe(importacionRemito);
						resultadoArea.setText(texto);
					} catch (ProductoInexistenteException e) {
						resultadoArea.setText(e.getClass().getName() + ": "
								+ e.getProductoVO().getId());
					} catch (OrdenCompraInexistenteException e) {
						resultadoArea.setText(e.getClass().getName() + ": "
								+ e.getOrdenCompraVO().getId());
					} catch (Exception e) {
						resultadoArea.setText(e.getClass().getName() + ": "
								+ e.getMessage());
					}
				}

				private String generarTextoResultadoDe(
						final ImportacionRemitoVO importacionRemito) {
					final StringBuilder out = new StringBuilder();
					out.append("Importado el remito " 
							+ importacionRemito.getRemitoVO().getId() + ".\n");
					out.append("\n");
					out.append("Devoluciones generadas: \n");
					if (importacionRemito.getNotaDevolucionVOs().isEmpty()) {
						out.append("No hay.");
					} else {
						for (NotaDevolucionVO devolucionVO : 
								importacionRemito.getNotaDevolucionVOs()) {
							out.append(devolucionVO.toString());
							out.append("\n");
						}
					}
					out.append("\n");
					out.append("Faltante detectados:\n");
					if (importacionRemito.getFaltantesItemOrdenCompraVOs().isEmpty()) {
						out.append("No hay.");
					} else {
						for (ItemOrdenCompraVO itemOrdenCompraVO : 
								importacionRemito.getFaltantesItemOrdenCompraVOs()) {
							out.append(itemOrdenCompraVO.toString());
							out.append("\n");
						}
					}
					final String texto = out.toString();
					return texto;
				}
			});
			pack();
			this.setSize(552, 350);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
